// -------------------------------- AJAX交互函数 ----------------------------//
// 接口的返回值即调用on_success回调时的参数，它总是一个数组
function _defun(url, method, args, on_success, on_failure) {
	var options = {
		method : method,
		parameters : $H(args).toQueryString()
	};
	var have_successed = false;
	var new_redirect = function(p) {
		// return true;
		// status:0 -> 未建立连接；[12002,12029,12030,12031,12152,13030,12159] -> 网络不通；
		// ie bug ?
		// 12002 - Server timeout
		// 12029,12030, 12031 - dropped connections (either web server or DB server)
		// 12152 - Connection closed by server.
		// 13030 - StatusText properties are unavailable, and a query attempt throws an exception
		try {
			if(p.status == 0 || p.status > 12000) {
				Tips.show('网络似乎断开了，请检查您的网络连接状态　<a href="main" class="s_reload" style="color:#CB0000;text-decoration:underline;">刷新</a>', 0, true);
				return false;
			}
		} catch(e) {
			return true;
		}
		try {
			if (p.status == 307 && p.statusText.include('No passport header')) {
				var rdurl = USE_SYS.name == 'vip.sohu' ? USE_SYS.protocol + '//vip.' : USE_SYS.protocol + '//mail.'
				window.top.location.href = rdurl + localDomain;
				return false;
			}
			if(p.responseText.include('pp18030_ui_')) {
				var rdurl = USE_SYS.name == 'vip.sohu' ? USE_SYS.protocol + '//vip.' : USE_SYS.protocol + '//mail.'
				window.top.location.href = rdurl + localDomain;
				return false;
			}
		} catch(e) {
			return true;
		}
	};
	if (on_success || on_failure) {
		var new_on_success = function(transport) {
			try {
				if(transport.responseText.isJSON()) {
					ret = transport.responseText.evalJSON(true);
				} else {
					ret = transport.responseText;
				}
				have_successed = true;
				on_success(ret);
			} catch (e) {}
		};
		var new_on_complete = function() {
			if(arguments[0] && !new_redirect(arguments[0])) {
				return false;
			}
			if (!have_successed) {
				on_failure();
			}
		};
	};
	if (on_success) options['onSuccess'] = new_on_success;
	options['onComplete'] = new_on_complete;
	try {
		__AJAX = new Ajax.Request(url, options);
	} catch(e) {}
}

function defun(url, method, fix) {
	if (method == null)
		method = 'post';
	// url = '.' + url;
	return (fix == null) ? function(args, on_success, on_failure) {
		_defun(url, method, args, on_success, on_failure);
	} : function(args, on_success, on_failure) {
		var s = args[fix];
		if(typeof(s) == "number" && s == -1) {
			return;
		}
		delete args[fix];
		_defun(url + '/' + s, method, args, on_success, on_failure);
	};
}

// 获取用户的总积分和当前积分
// 参数：无
// 返回值：一个包含两个元素的整数数组，第一个是用户的总积分，第二个是用户的当前积分
// 例子：{} => [664, 616]
var score_get = defun('./score', 'get');

// 获取所有profile的内容
// 参数：无
// 返回值：profile中对应的key和value，value可能是字符串或字符串的数组
// 例子：{} => {web_version: 'html', defaulteditor: 'html', ...}
var profile_get = defun('./profile', 'get');

// 修改profile中的某几项
// 参数：需要修改的key和value
// 返回值：
// is_success boolean profile能放的key是有限制的，不在范围内的key即使没有赋值也会返回成功
// 例子：{web_version: 'text', filters: ['0,0,,0,收件箱', 'a,sasa,,1,垃圾箱']} =>
// {is_success: true}
var profile_set = defun('./profile', 'put');

// 检查新邮件
// 参数：无
// 返回值：
// inbox integer 收件箱中有几封新信
// junk integer 垃圾邮件箱中有几封新信
// 例子：{} => {inbox: 3, junk: 0}
var mail_check = defun('./mail/check', 'get');

// 文件夹改名
// 参数：
// folder_id integer 要修改的文件夹id
// name string 要改成什么名字
// 返回值：
// is_success boolean
// 例子：{folder_id: 5, name: '自建文件夹2'} => {is_success: true}
var folder_rename = defun('./folder', 'put', 'folder_id');

// 文件夹创建
// 参数：
// name string 要创建的文件夹名字
// 返回值：
// folder_id integer 创建的文件夹id
// is_success boolean
var folder_create = defun('./folder', 'post');

// 文件夹删除（连同其中的信件）
// 参数：
// folder_id integer 要删除的文件夹id
// 返回值：
// is_success boolean
var folder_delete = defun('./folder', 'delete', 'folder_id');

// 获取所有文件夹信息
// 参数：无
// 返回值：
// totalMail integer 信件总数
// totalSize integer 信件总大小
// quotaSize integer 用户信箱大小
// folders [{
// folder_id integer 系统文件夹的id小于等于16
// name string 文件夹名字，系统文件夹返回的是汉字名，如果是英文界面的话要根据id自己转
// total integer 总邮件数目
// unread integer 未读邮件数目
// size integer 文件夹中信件总大小
// }]
var folder_detail = defun('./folder', 'get');

// 文件夹列表
// 参数：
// folder_id integer 要列的文件夹的id，未读邮件箱是-2
// sortMode integer 排序方式
// sortDirection boolean 是否倒序
// startIndex integer 当前页面从第几条纪录开始
// length integer 当前页面要有几条记录
// 返回值：
// totalCount integer 当前folder里总信件数目
// unread integer 当前folder中未读信件数目
// mails [{
// id integer 信件的唯一id
// sender {
// name string 发件人名字
// addr string 发件人地址
// }
// status integer 信件状态，每位表示一种状态，目前只用了两位，status & 0x1 != 0表示已回复，status & 0x2 !=
// 0表示已转发
// have_read boolean 是否已读
// have_att boolean 是否有附件
// have_star boolean 是否有星标
// subject string 标题
// date integer 发信的GMT时间戳
// size integer 信件大小
// }]
//
// 如何判断是否有前一页和后一页？startIndex > 0就肯定有前一页，startIndex + mails.length <
// totalCount就肯定有后一页。
var folder_list = defun('./folder', 'get', 'folder_id');

// 获取信纸内容
// 参数：
// name string 信纸的名字，如“001”或“yili”等
// 返回值：
// is_success boolean
// html string html模版
// text string 纯文本模板
var mail_get_stationery = defun('./mail/stationery', 'get', 'name');

// 移动信件
// 参数：
// dest_id integer 移动的目标文件夹id，-1表示是直接删除
// is_folder boolean 移动整个folder中的信件
// folder_id integer 源文件夹id，只有is_folder存在且为true时才有意义
// mails [integer] 要移动的信件id组成的数组
// 返回值：
// is_folder为true时，只返回一个is_success boolean
// 否则，返回一个关联数组，key integer是调用时提供的要移动的信件id转换成字符串的格式（这是JSON的限制，key必须是字符串），value
// boolean是对应的信件移动成功与否
// 示例：
// 把收件箱的所有信件移到草稿箱 {dest_id: 3（草稿箱id）, is_folder: true, folder_id: 1（收件箱id）} =>
// {is_success: true}
// 把未读邮件箱的几封信件移到草稿箱，其中一封移动失败了 {dest_id: 3, is_folder: false, mails: [12, 345,
// 567, 8]} => {'12': true, '345': false, '567': true, '8': true}
var mail_move = defun('./mail', 'post');

// 改变信件星标状态
// 参数：
// mails [integer] 要改变状态的信件id组成的数组
// is_add_star boolean 是要加上星标还是要去掉
// 返回值：
// is_success boolean 改变成功与否
var mail_change_star = defun('./mail', 'post');
//改变信件读信状态
//参数：
//mails [integer] 要改变状态的信件id组成的数组
//readflag int  是已读状态还是未读状态
//返回值：
//is_success boolean 改变成功与否
var mail_change_read = defun('./mail/upread', 'post');

// 搜索信件（暂不实现）
// 参数：
// keyword string 搜索的关键词
// pageIndex integer 搜索的结果显示第几页
// 返回值：
// 未定义
var mail_search = defun('./mail/search', 'post');

// 举报垃圾邮件
// 参数：
// mails [integer] 要举报的邮件的id组成的数组
// 返回值：
// is_success boolean 举报成功与否
var mail_report_spam = defun('./mail/spam', 'post');

// 读信
// 参数：
// id integer 要读的信件的id
// sortMode integer 排序方式
// sortDirection boolean 是否倒序
// folder_id integer 当前所处文件夹的id
// 返回值：
// next_id integer 下一封信的id
// pre_id integer 前一封信的id
// subject string 标题
// attachments [{
// name string 附件文件名
// url string 下载附件的链接
// }]
// receiver [{
// name string 收件人姓名
// addr string 收件人地址
// }]
// ccs [{
// name string 抄送人姓名
// addr string 抄送人地址
// }]
// bccs [{
// name string 暗送人姓名
// addr string 暗送人地址
// }]
// hasStar boolean 当前信件是否有星标
// sender {
// name string 发件人姓名
// addr 发件人地址
// }
// isRefused boolean 是否拒收
// isContact boolean 发件人是否在地址本里
// date integer 信件时间的GMT时间戳表示
// size integer 信件大小
// content string 转为html的信件正文内容
// stationery string 信件正文使用模板时模板的名字，不使用时就是空字符串
var mail_read = defun('./mail', 'get', 'id');

// 发信
// 参数：
// is_html boolean 信件正文是html还是text格式
// stationery string 信件正文使用模板时模板的名字，不使用时就是空字符串
// subject string 信件标题
// to [string] 收件人地址组成的数组
// cc [string] 抄送地址
// bcc [string] 暗送地址
// content string 信件正文
// is_save boolean 发信时是否在发件箱存一份
// origin integer 原来信件的id，没有就是0
// acttype 参见写信的acttype
// attachments [{}]
// 信件的附件数组，和上传附件或mail_save_att的返回值类似，虽然说是数组，但调用这个接口之前要先用$A().toJSON()转成一个字符串再调用
// 返回值：
// is_success boolean
// message string 信件发送失败的原因
var mail_send = defun('./mail', 'put');

// 从草稿发送信件
var mail_draft_send = defun('./mail', 'put', 'id');

// 保存草稿
// 参数：
// is_html boolean 信件正文是html还是text格式
// stationery string 信件正文使用模板时模板的名字，不使用时就是空字符串
// subject string 信件标题
// to [string] 收件人地址组成的数组
// cc [string] 抄送地址
// bcc [string] 暗送地址
// content string 信件正文
// attachments [{}] 信件的附件数组，和上传附件或mail_save_att的返回值类似，和mail_send一样，也要转成JSON
// 返回值：
// is_success boolean
// time integer 信件保存的时间
// id integer 保存的信件的id
var mail_save = defun('./mail', 'put');

// 写信（这个接口先放一下吧）
// 参数：
// 返回值：
// from string 发件人地址
// to [string] 收件人地址列表
// cc [string] 抄送地址列表
// bcc [string] 暗送地址列表
// subject string 标题
// context string 邮件内容
// bump string 不知道是啥，我搜了js里没有用到的
// checksign boolean 还不知道
// action integer 还不知道
// folder string 还不知道
// message string 还不知道
// htmleditor string html编辑器地址
// templatename string 写信使用那个模板
// autoinclude boolean 回信时是否引用原来信件
// autosave boolean 写信时是否定期保存
// acttype integer 表明对信件做什么操作
// -1是失败，0到5是REPLY、REPLYALL、FORWARD、EDIT、PREVIEW、FORWARDAS
// authenable boolean 发信时使用认证图片
var mail_write = defun('./', '');

// 把某封信的所有附件作为临时文件存在临时目录里
// 参数：
// id integer 要读的信件的id
// 返回值：[{
// id string 保存在临时目录里的附件id
// filename string 显示的名字
// size integer 附件大小
// type string 附件的mime类型
// }]
var mail_save_att = defun('./mail/att', 'get');

// 删除正写的信件的附件
// 参数：
// id string 要删除的文件的id
// 返回值：
// is_success boolean
var mail_del_att = defun('./mail/att', 'delete');

/*
 * 上传附件无法以js接口的形式暴露出来，可以认为客户端有如此形式的form，注意input的name属性不能变： <form
 * action="/webapp/mail/att" method="post" enctype="multipart/form-data"> upload
 * file:<input type="file" name="upload_file"/><br/> <input type="submit">
 * </form>
 * 
 * 返回值： id string 上传文件的id filename string 显示的名字 size integer 上传文件大小 type string
 * 上传文件的mime类型
 */

// ////////////////////// 地址薄AJAX交互函数接口 ////////////////////////////////////////
// 获取联系组信息：
// getContactCateAction （调用方式为：GET 形式为：/group）
// 参数：
// 无
// 返回：
// cateString: [{
// id integer 返回的组ID
// name string 返回的组名
// peopleCount integer 返回组中的用户数量
// }]
var get_contact_cate = defun('./group', 'get');



// 手机邮件接口
//获得用户手机邮件的服务设置信息
//参数：无
//返回值：
//    allsms boolean 开启邮件提醒
//    notsms boolean 关闭邮件提醒
//    fromlist string 发件人地址过滤
//    subjectlist string 主题内容过滤
//    ......
//例子：{}  ->  {allsms:"", notsms:true, fromlist:"", subjectlist:""}  成功
//      {}  ->  {status:-1, errmsg:"the reason"} 失败
var sms_get = defun('./sms_config/sms', 'get');

//获得用户手机邮件的高级选项信息
//参数：无
//返回值：
//    status int 操作结果，0为成功，-1为失败
//    option [{
//        ontimealert string 提醒条数超过限制的操作设定。1为每条0.5元，0为不提醒。
//        paypermsg string 提醒时间段的设定。1为8点-23点，0为全天。
//    }]
//例子：{}  ->  {status:0, option:[{ontimealert:0, paypermsg:1}]}
//      {}  ->  {status:-1, errmsg:"the reason"} 失败
var smsoption_get = defun('./sms_config/smsoption', 'get');

//修改用户手机邮件的服务设置信息
//参数：
//    allsms string 开启邮件提醒
//    notsms string 关闭邮件提醒
//    fromlist string 发件人地址过滤
//    subjectlist string 主题内容过滤
//返回值：
//    status int 操作结果，0为成功，1为失败
//    errmsg string 错误的提示信息。如果出错，该值才会存在
//例子：{allsms:"true", notsms:"", fromlist:"", subjectlist:"nosubject"}  -> {status:0}
var sms_post = defun('./sms_config/sms', 'post');

//修改用户手机邮件的高级选项信息
//参数：
//    OnTimeAlert string 提醒条数超过限制的操作设定。1为每条0.5元，0为不提醒。
//    PayPermsg string 提醒时间段的设定。1为8点-23点，0为全天。
//返回值：
//    status int 操作结果，0为成功，1为失败
//    errmsg string 错误的提示信息。如果出错，该值才会存在
//例子：{OnTimeAlert:"1", PayPermsg:"1"} -> {status:0}
var smsoption_post = defun('./sms_config/smsoption', 'post');

//取用户白名单
//返回结果：
//       {'wlist':[111.sohu.com,222@sohu.com],'flag':'0'}
var whitelist_get=defun('./whitelist', 'get');

//修改用户白名单
//参数：
//  action 要执行的动作 例如(修改，删除)
//  force  不知道是啥
//   email 添加到白名单的用户名
//   emailnew  要修改的白名单用户名
//示例：
//{'action':'editflag','flag':'1'} 修改白名单中的flag
//{'action':'addw','email':'111@sohu.com','force':'0'} 在白名单中添加 111@sohu.com
//{'action':'editw','email':'111@sohu.com','emailnew':'222@sohu.com','force':'0'} 编辑 111@sohu.com成 222@sohu.com
//{'action':'delw','email':'111@sohu.com'} 从白名单中删除 111@sohu.com
//{'action':'addb','email':'111@sohu.com','force':'0'}  在黑名单中添加 111@sohu.com
//{'action':'editb','email':'111@sohu.com','emailnew':'222@sohu.com','force':'0'}编辑 111@sohu.com成 222@sohu.com
//{'action':'delb','email':'111@sohu.com'}从黑名单中删除 111@sohu.com
//返回值：
//0：成功  {'status':'0'}
//1：不能添加自己   { 'status':'1'}
//2：用户要往白名单中加的email已经在黑名单中  {'status':'2'}
//3：用户要往黑名单中加的email已经在白名单中   {'status':'3'}
//-1:操作失败，解析errmsg             {'status':'-1','errmsg':'...'}
// var whitelist_post=defun('./whitelist', 'post');

// 新的白名单操作 （update by fjc 20090417）

// 添加白名单
var add_whitelist = defun('/address/addWhite', 'post');

// 修改白名单
var mod_whitelist = defun('/address/modWhite', 'post');

// 删除白名单
var del_whitelist = defun('/address/rmWhite', 'post');

//gaoyanxia add 20080916 用户地址簿中搜索联系人
//args:
//{'action':'search','searchkey':'啊','scope':'-1'}：按关键字查找： scope 为-1 表示在所有人内查找， scope 为组名时表示在组内查找
//{'action':'searchpinyin','pinyinkey':'0','scope':'-1'}：按拼音查找： scope为 -1 表示在所有人内查找，scope为组名时表示在组内查找；pinyinkey为0-4的整数
//增加一项pinyin 供排序用
//返回值：{'status': '0',liststring:{"nickname": "adsf", "personalemail": "aad@asdf.com","pinyin":""}, {"nickname": "\u554a\u554a", "personalemail": "jys@asdcom","pinyin":"bei"}]}
var contact= defun('./contact', 'get');

var setLogin = function (  params, onsuccess, onfailed ){
	return _defun( '/papp/interface/setmaillogin',  'post', params, onsuccess, onfailed );
};

var getLogin =  function (  params, onsuccess, onfailed ){
	return _defun( '/papp/interface/getmaillogin',  'get', params, onsuccess, onfailed );
};

//获取用户定时发送邮件的列表
//
//
var sotProxy =  defun('./sotproxy', 'get' );


// 发信
// 参数：
// is_html boolean 信件正文是html还是text格式
// stationery string 信件正文使用模板时模板的名字，不使用时就是空字符串
// subject string 信件标题
// to [string] 收件人地址组成的数组
// cc [string] 抄送地址
// bcc [string] 暗送地址
// content string 信件正文
// is_save boolean 发信时是否在发件箱存一份
// origin integer 原来信件的id，没有就是0
// acttype 参见写信的acttype
// attachments [{}]
// 信件的附件数组，和上传附件或mail_save_att的返回值类似，虽然说是数组，但调用这个接口之前要先用$A().toJSON()转成一个字符串再调用
// sot_time 用户定制的发信时间
// sot_file 邮件的名字
// sot_mod 是不是修改邮件 是就是1，不是为0
// sot_id 邮件在数据库中的编号
// sot_senderid 发送者的邮箱地址
// 返回值：
// is_success boolean
// message string 信件发送失败的原因
var sot_mail_send = defun('./mail', 'put');
// 保存定时草稿
// 参数：
// is_html boolean 信件正文是html还是text格式
// stationery string 信件正文使用模板时模板的名字，不使用时就是空字符串
// subject string 信件标题
// to [string] 收件人地址组成的数组
// cc [string] 抄送地址
// bcc [string] 暗送地址
// content string 信件正文
// attachments [{}] 信件的附件数组，和上传附件或mail_save_att的返回值类似，和mail_send一样，也要转成JSON
//sot_id	sot邮件在mysql中的编号
//sot_delpath sot在桶上的文件名
// 返回值：
// is_success boolean
// time integer 信件保存的时间
// id integer 保存的信件的id
var sot_draft_save = defun('./mail/sot_draft', 'post');

//定制发信-保存
//参数
var custom_mail_save = defun('./custommail/save', 'post');

//定制发信-列表
//
var custom_mail_list = defun('./custommail/list', 'post');

//定制发信-删除
var custom_mail_delete = defun('./custommail/delete', 'post');

// 发送明信片
var send_postcard = defun('/postcard/sendcard', 'post');

// 获取明信片的一系列信息
var get_postcard = defun('/postcard/template', 'get');

var mail_address = defun('/address/list', 'get');

// 添加组
var add_group = defun('/address/addGroup', 'post');

// 删除联系组
var del_group = defun('/address/rmGroup', 'post');

// 编辑联系组
var edit_group = defun('/address/modGroup', 'post');

// 删除联系人
var del_contact = defun('/address/rmContact', 'post');

// 快速添加联系人
var add_contact = defun('/address/addContact', 'post');

// 添加详细联系人
var add_d_contact = defun('/address/addDetailContact', 'post');

// 编辑联系人
var edit_contact = defun('/address/modContact', 'post');

// 编辑详细联系人
var get_d_contact = defun('/address/getDetailContact', 'get');

// 修改详细联系人信息
var edit_d_contact = defun('/address/modDetailContact', 'post');

// 导入其他邮箱地址簿接口
var import_other_addr = defun('/address/remoteImport', 'post');

//设置securitykey ，用户为事件加密
var sendSecurityKey = defun( './setSecurityKey', 'post');

// 设置黑名单
var mod_blacklist = defun('/address/editBlack', 'post');

// 删除黑名单
var del_blacklist = defun('/address/rmBlack', 'post');

// 快速添加多个联系人
var fast_add_contact = defun('/address/fastAdd', 'post');

// 获取地址本中积分的接口
var get_score_addr = defun('/address/getscore', 'post');

// 设置白名单
// var white_list = defun('');

// 是否只接受白名单的设置
var white_only = defun('/address/modProfile', 'get');

/***************************  会话接口  *********************************/
/*
 * 
 */
var conversation_list = defun('./conversation', 'get');

// 读取会话接口
var conversation_read = defun('./conversation', 'get', 'id');

/***************************   *********************************/


/************************* 邮件代收 ***************************/
//这里定义的东西实在太多了, Pjax 用于代收邮件相关
var Pjax = {
	getPopAccount: defun('/pop/list', 'post'),
	addPopAccount:defun('/pop/new','post'),
	delPopAccount:defun('/pop/del','post'),
	receivePopMail:defun('/pop/pop','post'),
	stopReceivePopMail:defun('/pop/stop','post'),
	getPopMailStatus:defun('/pop/status','post'),
	updatePopAccount:defun('/pop/update','post'),
	isReq:false
};
//--------------------新手上路-----------------------------
var TAjax = {
        get_mission : defun('/tourial/list', 'get'),
        complete_mission : defun('/tourial/complete', 'post'),
        get_prise : defun('/tourial/getscore', 'post')
};


/************************ 邮件搜索 **************************/

var mail_search = defun('search/', 'get');

/************************ 邮件搜索end **************************/

//
var saveToUdisk = defun('download', 'get',"mid");

//获取U盘单个文件夹的列表
var getUDiskList = defun('/udisk/IntForMailChildInfo.action', 'post' );

//获取U盘所有文件夹的列表
var getUDiskAllList = defun('/udisk/IntForMailAllFolderInfo.action', 'get');

//获取手机邮件用户信息
var getMobileUserInfo = defun('/mo/MobileUserInfo', 'get');

var getUDiskUserService = defun('/udisk/userService.action', 'get' );

/************************* vip 接口 **************************/
//args： {domain：sohu.com}
//返回值：{today：{'city':'..','date':'','high':'','low':'','weather':'..','wind':'','photo':'.'},tomorrow:{同today}}
var weather_get = defun('weather', 'get');

/* 文件夹锁 */
var folder_lock = defun('./lockfolder', 'post');
